#ifndef __SLIST_H__
#define __SLIST_H__

typedef void(*ft1)(void *);


#define my_scanf(op, format, ...) do{   \
    int ret = 0;                        \
    ret = scanf(format, __VA_ARGS__);   \
    while ('\n' != getchar())           \
        /*do nothing*/;                 \
    if (ret < 0)                        \
        goto op;                        \
} while (0)                             \


// 节点定义
typedef struct _node_t
{
    // 数据域
    void *data;

    // 指针域
    struct _node_t *next;
}node_t;

// 链表头信息结构体定义
typedef struct _slist_t
{
    node_t *p;
    int size;
    int count;
    ft1 my_destroy;
}slist_t;

typedef int(*ft2)(node_t *n1, node_t *n2);

// 创建头信息结构体
int slist_create(slist_t **s, int size, ft1 my_destroy);
// 尾插
int slist_append(slist_t *s, void *data);
// 头插
int slist_prepend(slist_t *s, void *data);
// 链表的遍历
int slist_traverse(slist_t *s, ft1 my_print);
// 链表的销毁
int slist_destroy(slist_t *s);
// 链表的检索插入
int slist_insert_by_index(slist_t *s, void *data, int index);
// 链表检索删除
int slist_delete_by_index(slist_t *s, int index);
// 链表的排序
int slist_sort(slist_t *s, ft2 my_compare);









#endif/*__SLIST_H__*/